package org.future.persistent.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.future.persistent.table.DBField;
import org.future.persistent.table.DBTable;

/**
 * sql 组装类
 * @author dycc
 * @date 2009-12-30 下午08:39:36
 */
public class SqlCreator {
    /**
     * 组装 insertSql
     * @param table
     * @return
     */
    public static List<Object> getInsertSql(DBTable table){
        List<Object> list = new ArrayList<Object>();
        Map<String, DBField> map = new HashMap<String, DBField>();
        map.putAll(table.getFields());
        map.putAll(table.getLargeFields());
        int[] types = new int[map.size()];          // 参数类型
        int paramNum = 0;                           // 参数数量
        StringBuffer sb = new StringBuffer();       // 存储 insert sql 语句
        sb.append("INSERT INTO " + table.getName());
        sb.append("(");
        // 
        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            DBField fd = map.get(key);
            sb.append(fd.getName());                // 数据库中的字段名称
            types[paramNum] = fd.getSqlType();      // 数据库中的字段类型
            if(it.hasNext()){
                sb.append(',');
            }
            paramNum++;                             // 字段数目加1
        }
        sb.append(')');
        sb.append(" VALUES(");
        for(int i=0;i<paramNum;i++){
            sb.append('?');
            if(i < paramNum -1){                    // 不是最后一个
                sb.append(',');
            }
        }
        sb.append(')');
        // 
        list.add(sb.toString());                    // sql 语句
        list.add(types);                            // 参数类型
        return list;
    }
    /**
     * 组装updateSql
     * @param table
     * @param hasLarge
     * @return
     */
    public static List<Object> getUpdateSql(DBTable table,boolean hasLarge){
        List<Object> list = new ArrayList<Object>();
        Map<String, DBField> map = new HashMap<String, DBField>();
        map.putAll(table.getFields());
        if(hasLarge){                               // 包含大字段
            map.putAll(table.getLargeFields());
        }
        int[] types = new int[map.size()];          // 参数类型
        int paramNum = 0;                           // 参数数量
        StringBuffer sb = new StringBuffer();       // 存储 update sql 语句
        sb.append("UPDATE " + table.getName());
        sb.append(" SET ");
        // 
        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            DBField fd = map.get(key);
            String fieldName = fd.getName();
            if(!table.isKeyField(fieldName)){
                sb.append(fieldName + "=?");        // 更新字段
                types[paramNum] = fd.getSqlType();  // 参数类型
                paramNum++;                         // 参数数目加1
                if(it.hasNext()){                   // 不是最后一个
                    sb.append(',');
                }
            }
        }
        // 添加where 语句
        sb.append(" WHERE 1=1");
        String[] ids = table.getIds();
        for(int i=0;i<ids.length;i++){
            String id = ids[i];
            DBField field = table.getField(id);
            if(field == null){
                throw new RuntimeException("主键设置错误:" + id + "不是" + table.getName() + "的主键.");
            }
            sb.append(" AND " + id + "=?");
            types[paramNum] = field.getSqlType();
            paramNum++;            
        }
        list.add(sb.toString());                    // sql 语句
        list.add(types);                            // 参数类型
        return list;
    }
    /**
     * 组装detailSql
     * @param table
     * @return
     */
    public static List<Object> getDetailSql(DBTable table){
        List<Object> list = new ArrayList<Object>();
        Map<String,DBField> map = new HashMap<String,DBField>();
        map.putAll(table.getFields());              // 放入所有的字段 [不包括大字段]
        // 
        final String tableName = table.getName();
        String[] ids = table.getIds();
        // 
        int[] types = new int[ids.length];          // 参数类型
        int paramNum = 0;                           // 参数数目
        StringBuffer sb = new StringBuffer();       // 存储detail Sql 语句
        sb.append("SELECT ");
        // 
        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            DBField fd = map.get(key);
            sb.append(tableName + "." + fd.getName());
            if(it.hasNext()){
                sb.append(',');
            }
        }
        sb.append(" FROM " + tableName);
        sb.append(" WHERE 1=1 ");
        for(int i=0;i<ids.length;i++){
            String id = ids[i];
            DBField field = table.getField(id);
            if(field == null){
                throw new RuntimeException("主键设置错误:" + id + "不是" + tableName + "的主键.");
            }
            sb.append(" AND " + id + "=?");
            types[paramNum] = field.getSqlType();
            paramNum++;            
        }
        list.add(sb.toString());                    // sql 语句
        list.add(types);                            // 参数类型
        return list;
    }
    /**
     * 组装delete Sql
     * @param table
     * @return
     */
    public static List<Object> getDelSql(DBTable table){
        List<Object> list = new ArrayList<Object>();
        // 
        final String tableName = table.getName();
        String[] ids = table.getIds();
        // 
        int[] types = new int[ids.length];
        int paramNum = 0;
        // 
        StringBuffer sb = new StringBuffer();       // 存储delete Sql 语句
        sb.append("DELETE FROM " + tableName);
        // 
        sb.append(" WHERE 1=1");
        for(int i=0;i<ids.length;i++){
            String id = ids[i];
            DBField field = table.getField(id);
            if(field == null){
                throw new RuntimeException("主键设置错误:" + id + "不是" + tableName + "的主键.");
            }
            sb.append(" AND " + id + "=?");
            types[paramNum] = field.getSqlType();
            paramNum++;
        }
        list.add(sb.toString());                    // delete Sql
        list.add(types);                            // 参数类型
        return list;
    }
    /**
     * 组装query Sql [不包含where 语句]
     * @param table
     * @return
     */
    public static String getQuerySql(DBTable table){
        Map<String,DBField> map = new HashMap<String,DBField>();
        map.putAll(table.getFields());              // 放入所有的字段 [不包括大字段]
        // 
        final String tableName = table.getName();
        // 
        StringBuffer sb = new StringBuffer();       // 存储detail Sql 语句
        sb.append("SELECT ");
        // 
        Iterator<String> it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            DBField fd = map.get(key);
            sb.append(tableName + "." + fd.getName());
            if(it.hasNext()){
                sb.append(',');
            }
        }
        sb.append(" FROM " + tableName + " ");
        return sb.toString();
    }
}
